// 主类型
interface covariatA {
  name: string
  age: number
}

// 子类型
interface covariatB {
  name: string
  age: number
  sex: string
}

let covariatObjA: covariatA = {
  name: '老墨',
  age: 33
}

let covariatObjB: covariatB = {
  name: '高启强',
  age: 33,
  sex: '男'
}

// 协变 子类型的属性和方法 可以覆盖父类型的属性和方法 并且只多不少
covariatObjA = covariatObjB

// 逆变 子类型的属性和方法 可以覆盖父类型的属性和方法 但是父类型的属性和方法不能被覆盖
let fnA = (params: covariatA) => {
  console.log("fnA")
}

let fnB = (params: covariatB) => {
  console.log("fnB")
}

// 一定是安全的
fnB = fnA // 正确
fnB(covariatObjB)

// 如果是正确的 就是双向协变
// fnA = fnB // 错误

/* 
双向协变需要在tsconfig.json中配置
"strictFunctionTypes": false,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible.
*/